package com.example.springbooteasycode.zjrc.project.Koal.AAAstructure.HttpAndRpc;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.io.ByteArrayOutputStream;


/**
 * 构造Http请求对象，将实体类字段按顺序转换为字节数组并拼接
 * @author Csa
 * @date 2025/09/01
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CheckAndGenerateArpcByGeerRequestEntity {

    /**
     * 命令代码
     * "01"-验证ARQC;
     * "02"-产生ARPC;
     * "03"-验证ARQC并产生ARPC
     */
    private String commandCode;

    /**
     * 算法标识
     * 00、01、02-国际算法；
     * 03-国密算法
     */
    private String algorithm;

    /**
     * UDK数据源
     * 卡号+卡序号（后两位），从后到前取16位
     */
    private String udk;

    /**
     * ATC
     */
    private String atc;

    /**
     * ARQC
     */
    private String arqc;

    /**
     * 数据长度
     */
    private String datalen;

    /**
     * 数据
     */
    private String data;

    /**
     * 授权响应密文的响应代码
     * F0F0
     */
    private String authorizationResponseCipherText;

    public static void main(String[] args) {
        // 构建一个示例对象，实际使用时替换为真实数据
        CheckAndGenerateArpcByGeerRequestEntity entity = CheckAndGenerateArpcByGeerRequestEntity.builder()
                .commandCode("01")
                .algorithm("00")
                .udk("1234567890123456")
                .atc("1234")
                .arqc("1234567890123456")
                .datalen("0010")
                .data("SampleData")
                .authorizationResponseCipherText("F0F0")
                .build();

        try {
            byte[] result = entity.convertToByteArray();
            System.out.println("拼接后的字节数组长度：" + result.length);
            // 输出字节数组的十六进制形式
            for (byte b : result) {
                System.out.print(String.format("%02X ", b));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 将实体类字段按顺序转换为字节数组并拼接
     *
     * @return 拼接后的字节数组
     * @throws IOException 操作字节输出流可能出现的异常
     */
    private byte[] convertToByteArray() throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        // 按顺序将各字段转换为字节并写入输出流
        bos.write(commandCode.getBytes(StandardCharsets.UTF_8));
        bos.write(algorithm.getBytes(StandardCharsets.UTF_8));
        bos.write(udk.getBytes(StandardCharsets.UTF_8));
        bos.write(atc.getBytes(StandardCharsets.UTF_8));
        bos.write(arqc.getBytes(StandardCharsets.UTF_8));
        bos.write(datalen.getBytes(StandardCharsets.UTF_8));
        bos.write(data.getBytes(StandardCharsets.UTF_8));
        bos.write(authorizationResponseCipherText.getBytes(StandardCharsets.UTF_8));

        return bos.toByteArray();
    }
}
